package com.sanben.common.util;

import com.sanben.common.constant.Constant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;

/**
 * @author cyh
 * @description: 文件上传 工具类
 * @date: 2020-08-11
 */
@Slf4j
public class FileHandleUtil {

    /**
     * 上传文件的类别，是指要上传到本地，还是上传到云服务器
     */
    public static String type;

    /**
     * 上传文件的位置[文件存放的目录]
     */
    public static String bucket;

    /**
     * 绝对路径
     */
    private static String absolutePath="";

    public static String upload(InputStream inputStream, String path, String filename) {
        //上传到本地
        if(type.equals(Constant.LOCAL)){
            //第一次会创建文件夹
            createDirIfNotExists();
            String resultPath = bucket + path + getYMDByPath() + filename;
            //存文件
            File uploadFile = new File(absolutePath,resultPath);
            try {
                FileUtils.copyInputStreamToFile(inputStream, uploadFile);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            return resultPath;
        }
        if(type.equals(Constant.ALIYUN_OOS)){
            //TODO 上传到oss
            return "待开发";
        }
        log.error("配置文件缺少file.type");
        return null;
    }

    /**
     * 上传单个文件
     * 最后文件存放路径为：static/upload/image/test.jpg
     * 文件访问路径为：http://127.0.0.1:8080/upload/file/2019/01/01/test.jpg
     * 该方法返回值为：/upload/image/test.jpg
     *
     * @param file     文件
     * @param path     文件路径，如：file/
     * @param filename 文件名，如：test.jpg
     * @return 成功：上传后的文件访问路径，失败返回：null
     */
    public static String upload(MultipartFile file, String path, String filename) {
        try {
            return upload(file.getInputStream(), path, filename);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 获取年月日格式的字符串
     *
     * @return
     */
    private static String getYMDByPath() {
        StringBuffer stringBuffer = new StringBuffer();
        LocalDateTime now = LocalDateTime.now();
        stringBuffer.append(now.getYear()).append("/").append(now.getMonth().getValue()).append("/").append(now.getDayOfMonth()).append("/");
        return stringBuffer.toString();
    }

    /**
     * 创建文件夹路径
     */
    private static void createDirIfNotExists() {
        if (!absolutePath.isEmpty()) {
            return;
        }
        //获取跟目录
        File file = null;
        try {
            file = new File(ResourceUtils.getURL("classpath:").getPath());
        } catch (FileNotFoundException e) {
            throw new RuntimeException("获取根目录失败，无法创建上传目录！");
        }
        if (!file.exists()) {
            file = new File("");
        }
        absolutePath = file.getAbsolutePath();
        File upload = new File(absolutePath, bucket);
        if (!upload.exists()) {
            upload.mkdirs();
        }
    }

    /**
     * 删除文件
     *
     * @param path 文件访问的路径upload开始 如： /upload/image/test.jpg
     * @return true 删除成功； false 删除失败
     */
    public static boolean delete(String path) {
        File file = new File(absolutePath, bucket);
        if (file.exists()) {
            return file.delete();
        }
        return false;
    }
}

